package com.bugpool.leilema.tc.mapper;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.bugpool.leilema.freamwork.annotation.DataScope;
import com.bugpool.leilema.tc.bean.entity.SysRole;
import com.bugpool.leilema.tc.bean.req.RoleDataScopeReq;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;

import java.util.List;
import java.util.Set;

/**
 * @Author wh
 * @Description
 * @Date 2023/3/2 18:14
 * @Version 1.0
 **/
@Mapper
public interface RoleMapper extends BaseMapper<SysRole> {
    /**
     * 获取 角色列表
     *
     * @param page
     * @param user
     * @return
     */
    Page<SysRole> selectPageByUser(Page<SysRole> page, @Param("userId") Long userId);

    List<SysRole> selectListByUser(@Param("userId") Long userId);

    /**
     * 删除角色菜单的关联
     *
     * @param ids
     */
    void deleteRoleMenuIds(@Param("ids") List<Long> ids);


    /**
     * 新增 角色菜单栏关系
     *
     * @param roleId
     * @param menuIds
     */
    void insertRoleMenu(@Param("roleId") Long roleId, @Param("menuIds") List<Long> menuIds);

    default void updateRoleStatus(Long roleId, String status) {
        UpdateWrapper<SysRole> wrapper = new UpdateWrapper<>();
        wrapper.lambda().set(SysRole::getStatus, status).eq(SysRole::getRoleId, roleId);
        this.update(SysRole.builder().roleId(roleId).status(status).build(), wrapper);
    }

    void delRoleByUserId(@Param("userIds") List<Long> userIds);

    /**
     * @param roleIds
     * @return
     */
    default List<SysRole> getRolesByRoleIds(List<Long> roleIds) {
        QueryWrapper<SysRole> wrapper = new QueryWrapper<>();
        wrapper.lambda().in(SysRole::getRoleId, roleIds);
        return this.selectList(wrapper);
    }

    /**
     * 更新角色的数据权限
     *
     * @param roleDataScopeReq
     */
    default void updateRoleDataScope(RoleDataScopeReq roleDataScopeReq) {
        UpdateWrapper<SysRole> wrapper = new UpdateWrapper<>();
        wrapper.lambda()
                .set(SysRole::getDataScope, roleDataScopeReq.getDataScope())
                .eq(SysRole::getRoleId, roleDataScopeReq.getRoleId());
        this.update(new SysRole(), wrapper);
    }
}
